iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Cloud Native

關於 WebAssembly 也能變成 Container 的這檔事系列 第 5

Wasm Dockerfile 該怎麼撰寫

  • 分享至 

  • xImage
  •  

Wasm+Dockerfile

經過兩天的 WASM+WASI 概念建設之後,我們趕快回到跟 Docker 有關的部分吧!

沒錯,就是常見的的 Dockerfile。

實際範例

Day2 的應用為例

# syntax=docker/dockerfile:1

# 第一區是用來安裝與設定 Rust 的工作環境
# 由於應用程式是以 Rust 語言撰寫的,因此此處的 Base Image 是 rust:latest
FROM --platform=$BUILDPLATFORM rust:latest AS buildbase
WORKDIR /
# 新增 Rust 的 wasm32-wasi 目標平台,必須新增此平台才能讓 Rust 能編譯成 WASM
RUN <<EOT bash
	set -ex
	rustup target add wasm32-wasi
EOT

# 第二區用來將應用程式編譯成 WASM 的格式
FROM buildbase AS build
RUN mkdir -p /hello
WORKDIR /hello
# 將範例中的 Cargo.toml(可以想像成 Rust 應用程式的設定檔案) 加入工作目錄
COPY Cargo.toml /hello
# 將範例中的程式碼複製進工作目錄
COPY src /hello/src
# 使用 cargo 來將 Rust 應用程式編譯成 WASM
RUN cargo build --release --target wasm32-wasi

# 最後則是製作給使用者用的 WASM Container Image
# 以 WASM 為主的環境,如 Day 3 所言,只需要一個 Wasm 檔案就能執行
# 因此我們可以用 scratch ,一個完全乾淨的 base image 來開始
FROM scratch
# 定義 Wasm+Container 該怎麼與此 Image 互動
ENTRYPOINT ["/hello.wasm", "Hello from", "WasmEdge"]
# 從第二區把編譯好的 WASM 放入目前的資料夾
COPY --link --from=build /hello/target/wasm32-wasi/release/hello.wasm /hello.wasm

最小範例

如果上面的 Dockerfile 太過於複雜,我們可以將跟 Rust 應用程式有關的部分都拿掉,比如說開發者使用的是其他的程式語言,那我們可以將 Dockerfile 改成下面這個版本:

# syntax=docker/dockerfile:1
# 一樣是從乾淨的 base image 開始
FROM scratch
# 將工作目錄設定成根目錄 `/`
WORKDIR /
# 將編譯好的 WASM 檔案放入根目錄中
COPY hello.wasm /
# 設定進入點
ENTRYPOINT ["/hello.wasm", "Hello from", "WasmEdge"]

上一篇
Wasm 如何與系統互動
下一篇
Wasm+Hello World
系列文
關於 WebAssembly 也能變成 Container 的這檔事15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言